R ist eine Programmiersprache, die vor allem im Bereich der Statistik verwendet wird
die Kernprogrammiersprache (core R) wird durch verschiedenste Bibliotheken, Erweiterungen und Weiterentwicklungen verfeinert
R ist open source und freie Software
RStudio ist eine Entwicklungsumgebung für R
RStudio stellt die Nutzer:innenoberfläche und beinhaltet Tools wie einen Viewer, Code-highlighting und vieles mehr
Übersicht
Wenn ihr ein neues Projekt in R angeht, erstellt ein R-Projekt in einem neuen Ordner (File -> New Project)
Damit habt ihr den Arbeitspfad als Ausgangspunkt festgelegt und könnt alle Pfadangaben relativ zum Ausgangspunkt festlegen
Ihr habt außerdem die Möglichkeit eure Arbeitsumgebung für die nächste Session zu speichern
Erstellt jetzt in eurem Projektordner ein R-Skript und öffnet es
R-Skripte sind letztendlich einfach Textdateien, die euren Code enthalten
Ihr könnt entweder den kompletten Code zusammen ausführen oder einzelne Zeilen/Abschnitte
In der Konsole könnt ihr Code ausführen, den ihr nicht für später speichern möchtet
Die Ausgabe wird dann ebenfalls in der Konsole angezeigt
Wenn ihr den Code eines Skripts ausführt, dann findet ihr die Ausgaben ebenfalls in der Konsole
Wenn ihr Daten in Variablen speichert, könnt ihr diese danach in der Arbeitsumgebung sehen
Aktuell sollte eure Arbeitsumgebung noch leer sein
# Die Grundrechenarten in R:
# Addition +
# Subtraktion -
# Multiplikation *
# Division /
(3*3-6)/3+10441 [1] 10442
[1] 10448
Übertragt die Inhalte jeder Box dieses Tutorials in euer geöffnetes Skript
Führt den Inhalt jedes Skripts einzeln aus (Strg + Enter bzw. Strg + R) und versucht dabei jeweils darauf zu achten wie sich die Variablen in der Arbeitsumgebung verändern
Dabei wird jeweils die komplette Zeile, in der sich der Cursor befindet, ausgeführt (oder der markierte Text)
Falls ihr eine Fehlermeldung ausgespuckt bekommt, sagt einfach bescheid!
# Um das Ergebnis einer Berechnung zu speichern, kann es in einer Variable festgehalten werden
# Es gibt zwei Wege einer Variable einen Wert zuzuweisen:
Nummer <- 3
Nummer = 3
# = und <- haben in diesem Fall die gleiche Funktion
# Um das Ergebnis spaeter aufzurufen, muss lediglich der Variablenname ausgefuehrt werden
# In der Konsole wird dann der Befehl erneut angezeigt, gefolgt vom Wert der Variable
Nummer[1] 3
R-Funktionen werden durch runde Klammern gekennzeichnet
Funktionen können unterschiedlich viele Eingabe- und Ausgabeargumente haben
Die Funktion mean() berechnet z.B. den Mittelwert aus einer Reihe numerischer Daten
Mit einem ? vor dem Funktionsnamen könnt ihr mehr über die jeweilige Funktion erfahren
[1] 1 2 3
[,1] [,2] [,3]
MyVector 1 2 3
MyVector 1 2 3
MyVector 1 2 3
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 1
[3,] 0 0 0
[1] "numeric"
# Auch das Ergebnis dieser Funktion kann ich in einer neuen Variable speichern
ClassOfNumber <- class(Number)
# Und was hat das Ergebnis für eine Klasse?
class(ClassOfNumber)[1] "character"
# Auch dieses Ergebnis könnte ihr wieder in einer Variable speichern
ClassOfClassOfNumber <- class(ClassOfNumber)
ClassOfClassOfNumber[1] "character"
# Anführungszeichen markieren für R eine character-Variable
Number <- "3"
# Das geht nicht
Number <- Number + 8Error in Number + 8: nicht-numerisches Argument für binären Operator
[1] "character"
# Die Funktion as.numeric() wandelt eine andere Variablenklasse in einen numerischen Wert um
Number <- as.numeric(Number)
class(Number)[1] "numeric"
[1] 11
[1] NA
[,1] [,2] [,3]
[1,] 4 3 3
[2,] 3 4 4
[3,] 3 3 3
[1] "matrix" "array"
# Wenn man mit (Forschungs-)Datensaetzen arbeitet, bietet es sich meistens an diese als dataframe
# zu speichern, da bei der Matrix-Klasse alle Werte die gleiche Datenklasse haben muessen
MyNewMatrix <- data.frame(MyNewMatrix)
class(MyNewMatrix)[1] "data.frame"
# Hier erstellen wir einen dataframe mit drei Spalten: x, y und z
# Spalte x hat die Klasse numeric (bedeutet 1 bis 3)
# Spalte y hat die Klasse character
# Spalte z hat die Klasse logical
my_df <- data.frame(
x = 1:3,
y = c("a", "b", "c"),
z = c(T,F,F)
)
my_df x y z
1 1 a TRUE
2 2 b FALSE
3 3 c FALSE
# Mit eckigen Klammern kann ich auch spezifische Elemente eines dataframes adressieren
# Zeilen und Spalten werden dabei mit einem Komma getrennt: [Zeile, Spalte]
# Die Zeilen und Spalten sind dafuer durchnummeriert
my_df[1,2][1] "a"
# Wenn ich einen der Werte leer lasse, bekomme ich die komplette Zeile oder Spalte ausgegeben
my_df[1,] x y z
1 1 a TRUE
[1] "a" "b" "c"
# Wenn Spalten und/oder Zeilen benannt sind, können auch die Namen verwendet werden
# Wir haben die Spalten mit x, y und z benannt, die Zeilen haben keine Namen
my_df[1,"x"][1] 1
# Wenn man mehrere Zeilen oder Spalten auf einmal aufrufen möchte, muss
# man wieder die combine-Funktion verwenden
my_df[c(1,2), c("x","y")] x y
1 1 a
2 2 b
[1] 1 2 3
[1] 1 2 3
Warning in mean.default(my_df): Argument ist weder numerisch noch boolesch:
gebe NA zurück
[1] NA
[1] 2
[1] 0.3333333
# Jetzt erstellen wir einen Übungsdatensatz:
names <- c("Robert", "Christian", "Nancy", "Annalena", "Marco", "Hubertus", "Boris", "Cem", "Lisa", "Karl", "Volker", "Steffi", "Bettina", "Svenja", "Klara", "Wolfgang")
gender = factor(c("m", "m", "w", "w", "m", "m", "m", "m", "w", "m", "m", "w", "w", "w", "w", "m"))
age = c(54, 44, 53, 43, 46, 51, 63, 58, 55, 60, 53, 55, 55, 55, 47, 53)
# Die IQ-Werte werden anhand einer Normalverteilung zufällig generiert
# Indem wir den seed festlegen, bekommen wir alle die gleichen Zufallszahlen
set.seed(3425)
iq = rnorm(16, mean = 100, sd = 15)
# Jetzt erstellen wir den data.frame
sample_data <- data.frame(names,gender,age,iq)[1] 52.8125
[1] 100.7334
m w
9 7
Bibliotheken sind Sammlungen von R-Funktionen, Datensätzen und Code, die die Funktionalität von base R erweitern
Bibliotheken müssen zunächst pro System einmal installiert werden
Anschließend können sie geladen und dann genutzt werden
# Die describe-Funktion bietet einen Überblick über verschiedene Kennwerte der Variablen des Datensatzes
describe(sample_data) vars n mean sd median trimmed mad min max range skew
names* 1 16 8.50 4.76 8.50 8.50 5.93 1.00 16.00 15.00 0.00
gender* 2 16 1.44 0.51 1.00 1.43 0.00 1.00 2.00 1.00 0.23
age 3 16 52.81 5.54 53.50 52.79 2.97 43.00 63.00 20.00 -0.20
iq 4 16 100.73 15.99 98.41 100.84 15.03 70.57 129.36 58.79 -0.10
kurtosis se
names* -1.43 1.19
gender* -2.07 0.13
age -0.82 1.39
iq -0.82 4.00
# Durch das R-Projekt weiß in welchem Ordner es nach der Datei suchen muss
# Mit der read()-Funktion können wir einen Datensatz aus einer csv-Datei einlesen
fb_data <- read.csv2(file.path("dateien", "Daten Fragebogen.csv"))
# Alternativ kann man den Datensatz auch direkt aus dem Internet importieren:
fb_data <- read.csv2(file.path("https://jannisbosch.github.io/R-Tutorial/dateien/Daten%20Fragebogen.csv"))
# Die head()-Funktion ermöglicht uns einen Überblick über die Variablen im Datensatz
head(fb_data) Upn Alter gesch spq1 spq2 spq3 spq4 spq5 spq6 spq7 spq8 spq9 spq10 spq11
1 1 22 1 0 1 0 3 2 1 1 3 0 0 2
2 2 22 1 2 0 1 1 1 0 2 2 0 0 0
3 3 27 1 3 1 1 1 1 1 2 0 1 1 1
4 4 30 0 3 1 2 3 3 3 1 3 3 2 2
5 5 23 0 3 1 1 3 1 0 3 2 3 2 1
6 6 25 0 0 0 0 0 0 0 0 1 2 0 0
spq12 spq13 spq14 spq15 spq16 spq17 spq18 spq19 spq20 spq21 spq22 spq23 spq24
1 0 2 1 2 3 4 0 0 0 1 0 3 3
2 0 0 0 0 3 1 1 2 0 1 0 1 0
3 0 0 0 2 1 1 0 0 1 0 0 0 1
4 1 2 1 3 4 2 1 1 3 1 0 3 3
5 1 1 0 2 3 0 0 2 2 0 1 3 1
6 0 0 0 0 3 0 0 2 0 2 0 2 3
spq25 spq26 spq27 spq28 spq29 spq30 spq31 spq32 spq33 spq34 spq35 spq36 spq37
1 NA 1 0 3 3 0 4 2 4 3 3 0 0
2 1 1 0 1 2 0 2 1 3 3 1 0 0
3 1 0 2 1 0 0 0 0 0 1 1 1 0
4 4 1 3 3 1 1 1 2 3 3 1 1 3
5 1 0 3 0 1 0 0 1 0 0 0 0 0
6 2 0 0 0 0 2 0 0 0 0 0 0 0
spq38 spq39 spq40 spq41 spq42 spq43 spq44 spq45 spq46 spq47 spq48 spq49 spq50
1 0 0 3 0 3 1 0 3 2 0 0 0 3
2 4 0 2 0 2 1 1 1 2 0 0 0 2
3 1 0 0 0 1 0 1 1 0 0 0 1 1
4 3 1 2 3 1 2 1 1 2 1 0 0 2
5 1 0 0 0 0 0 0 0 1 0 0 0 0
6 0 0 0 0 0 0 0 0 0 0 0 0 0
spq51 spq52 spq53 spq54 spq55 spq56 spq57 spq58 spq59 spq60 spq61 spq62 spq63
1 1 3 0 3 1 1 4 3 0 0 0 0 0
2 1 0 1 0 0 3 1 3 0 0 3 0 0
3 0 2 1 2 0 0 2 1 0 0 2 0 1
4 3 3 2 1 1 2 3 4 1 1 1 1 3
5 0 0 1 2 0 0 2 1 0 0 0 0 2
6 0 2 0 0 0 0 2 0 0 0 0 0 0
spq64 spq65 spq66 spq67 spq68 spq69 spq70 spq71 spq72 spq73 spq74
1 3 2 3 3 3 3 0 1 0 4 1
2 1 0 1 2 2 1 2 0 3 1 0
3 0 0 2 0 0 1 0 0 0 2 0
4 3 3 NA 2 1 3 3 2 3 3 1
5 0 0 0 0 0 0 2 0 1 0 0
6 0 0 2 0 0 0 0 0 0 4 0
# Berechnung der Skala Odd Believes & Magical Thinking - Items 3, 12, 21, 30, 39, 47, 55
# Zunächst schauen wir uns mit Hilfe der alpha()-Funktion aus der psych-Bibliothek
# das Cronbach's Alpha und weitere Parameter für die Itemanalyse an
alpha(fb_data[,c("spq3", "spq12", "spq21", "spq30", "spq39", "spq47", "spq55")])
Reliability analysis
Call: alpha(x = fb_data[, c("spq3", "spq12", "spq21", "spq30", "spq39",
"spq47", "spq55")])
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.9 0.9 0.91 0.55 8.7 0.02 1.1 1 0.55
95% confidence boundaries
lower alpha upper
Feldt 0.85 0.9 0.93
Duhachek 0.86 0.9 0.94
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
spq3 0.87 0.87 0.87 0.52 6.4 0.026 0.017 0.55
spq12 0.88 0.88 0.89 0.54 7.2 0.024 0.023 0.55
spq21 0.89 0.89 0.90 0.57 8.1 0.022 0.023 0.60
spq30 0.88 0.88 0.89 0.56 7.5 0.023 0.016 0.55
spq39 0.91 0.91 0.91 0.61 9.6 0.019 0.011 0.64
spq47 0.87 0.87 0.87 0.53 6.8 0.025 0.017 0.55
spq55 0.88 0.88 0.89 0.55 7.2 0.023 0.026 0.56
Item statistics
n raw.r std.r r.cor r.drop mean sd
spq3 57 0.89 0.89 0.89 0.84 1.18 1.3
spq12 57 0.83 0.82 0.78 0.74 1.54 1.4
spq21 57 0.72 0.73 0.67 0.63 0.98 1.1
spq30 57 0.79 0.78 0.75 0.71 0.95 1.3
spq39 57 0.60 0.62 0.53 0.49 0.70 1.1
spq47 57 0.86 0.85 0.85 0.78 1.00 1.4
spq55 57 0.81 0.81 0.77 0.73 1.04 1.4
Non missing response frequency for each item
0 1 2 3 4 miss
spq3 0.44 0.19 0.16 0.18 0.04 0
spq12 0.32 0.23 0.18 0.16 0.12 0
spq21 0.40 0.37 0.11 0.09 0.04 0
spq30 0.54 0.18 0.12 0.11 0.05 0
spq39 0.61 0.19 0.09 0.09 0.02 0
spq47 0.58 0.14 0.07 0.12 0.09 0
spq55 0.54 0.16 0.12 0.07 0.11 0
# Die rowMeans()-Funktion berechnet zeilenweise den Mittelwert für den Datensatz im Eingabeargument
# Diese Datenreihe von Mittelwerten wird dann als neue Spalte OBMT in unserem Datensatz gespeichert
fb_data[,"OBMT"] <- rowMeans(fb_data[,c("spq3", "spq12", "spq21", "spq30", "spq39", "spq47", "spq55")], na.rm = T)
fb_data[,"OBMT"] [1] 0.2857143 0.2857143 0.1428571 1.1428571 0.2857143 0.5714286 0.8571429
[8] 0.1428571 0.7142857 0.0000000 3.1428571 1.2857143 0.0000000 2.0000000
[15] 0.2857143 2.8571429 1.7142857 0.5714286 0.0000000 1.5714286 1.2857143
[22] 0.4285714 0.1428571 3.0000000 0.2857143 1.7142857 2.4285714 1.2857143
[29] 0.4285714 0.2857143 0.0000000 0.4285714 2.7142857 0.5714286 0.0000000
[36] 0.2857143 0.0000000 1.4285714 0.0000000 0.1428571 0.7142857 0.4285714
[43] 1.4285714 0.7142857 1.5714286 0.1428571 0.0000000 0.8571429 1.4285714
[50] 1.2857143 3.2857143 1.7142857 0.8571429 3.5714286 2.5714286 2.2857143
[57] 2.5714286
Berechnet das Cronbach’s Alpha für die Excessive Social Anxiety Skala
Berechnet den Skalenmittelwert der Excessive Social Anxiety Skala für jede einzelne Person
Berechnet den Stichprobenmittelwert für die Excessive Social Anxiety Skala
Reliability analysis
Call: alpha(x = fb_data[, c("spq2", "spq11", "spq20", "spq29", "spq38",
"spq46", "spq54", "spq71")])
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.82 0.83 0.84 0.39 5.1 0.035 1.2 0.77 0.39
95% confidence boundaries
lower alpha upper
Feldt 0.75 0.82 0.89
Duhachek 0.76 0.82 0.89
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
spq2 0.81 0.82 0.82 0.40 4.7 0.038 0.024 0.41
spq11 0.81 0.82 0.82 0.39 4.5 0.039 0.024 0.39
spq20 0.84 0.85 0.85 0.45 5.7 0.032 0.012 0.44
spq29 0.79 0.80 0.80 0.36 4.0 0.043 0.018 0.38
spq38 0.79 0.80 0.81 0.37 4.1 0.042 0.020 0.37
spq46 0.79 0.80 0.79 0.36 3.9 0.042 0.016 0.37
spq54 0.81 0.82 0.82 0.39 4.6 0.038 0.026 0.41
spq71 0.79 0.80 0.81 0.37 4.1 0.042 0.025 0.38
Item statistics
n raw.r std.r r.cor r.drop mean sd
spq2 56 0.62 0.63 0.55 0.49 0.96 1.06
spq11 57 0.67 0.67 0.61 0.54 1.09 1.15
spq20 57 0.46 0.44 0.31 0.28 1.56 1.24
spq29 57 0.76 0.77 0.75 0.68 0.93 1.05
spq38 57 0.75 0.75 0.72 0.64 1.42 1.25
spq46 57 0.77 0.78 0.78 0.69 0.98 0.99
spq54 57 0.68 0.65 0.57 0.52 1.84 1.45
spq71 57 0.73 0.75 0.70 0.65 1.00 0.96
Non missing response frequency for each item
0 1 2 3 4 miss
spq2 0.43 0.32 0.11 0.14 0.00 0.02
spq11 0.40 0.30 0.12 0.16 0.02 0.00
spq20 0.23 0.33 0.14 0.25 0.05 0.00
spq29 0.47 0.23 0.19 0.11 0.00 0.00
spq38 0.30 0.28 0.18 0.19 0.05 0.00
spq46 0.39 0.35 0.16 0.11 0.00 0.00
spq54 0.30 0.09 0.23 0.25 0.14 0.00
spq71 0.37 0.35 0.19 0.09 0.00 0.00
fb_data[,"ESA"] <- rowMeans(fb_data[,c("spq2", "spq11", "spq20", "spq29", "spq38", "spq46", "spq54", "spq71")], na.rm = T)
fb_data[,"ESA"] [1] 1.5000000 1.0000000 0.7500000 1.8750000 1.1250000 0.0000000 1.6250000
[8] 1.0000000 1.7500000 2.6250000 1.0000000 3.2500000 0.0000000 2.2500000
[15] 0.7500000 0.0000000 2.2500000 0.5000000 0.6250000 1.0000000 1.3750000
[22] 0.2500000 1.7500000 1.6250000 1.6250000 1.8750000 0.8750000 0.8571429
[29] 0.3750000 1.0000000 1.0000000 1.8750000 1.3750000 0.5000000 0.6250000
[36] 0.2500000 0.1250000 1.5000000 0.3750000 1.6250000 0.7500000 0.6250000
[43] 0.8750000 1.3750000 1.2500000 1.0000000 1.8750000 2.8750000 1.1250000
[50] 2.6250000 0.6250000 1.5000000 2.5000000 0.0000000 1.3750000 1.2500000
[57] 2.3750000